#ifndef PIO_H
#define PIO_H

/**
 * @file pio.h
 * @brief Implementa I/O assincrono de disco usando pool de threads
 */
#include <stdio.h>




typedef struct pio_t pio;

typedef void (*piocallback)(void * data, size_t total);

/**
 * @brief Cria um mestre de io paralelo
 * @param poolsize Quantidade de workers de IO
 */
pio * piocreate(unsigned int poolsize);

/**
 * @brief Destroi um mestre (e suas threads) de io paralelo
 * @param io Mestre
 */
void piodestroy(pio * io);

/**
 * @brief Atualiza estados completos
 */
int pioupdate(pio * io);

/**
 * @brief Adiciona um trabalho de leitura ao buffer
 * @param io Mestre
 * @param from Arquivo de leitura (fonte)
 * @param to Buffer onde os dados serao escritos (destindo)
 * @param data Dados privados a serem passados de volta no callback
 * @param done Callback de retorno
 */
void pioread(pio * io, FILE * from,  void * to, size_t size, void * data, piocallback done);


/**
 * @brief Adiciona um trabalho de leitura ao buffer
 * @param io Mestre
 * @param to Arquivo ondes os dados serao escritos (destindo)
 * @param from Buffer de leitura (fonte)
 * @param data Dados privados a serem passados de volta no callback
 * @param done Callback de retorno
 */
void piowrite(pio * io, FILE * to, void * from, size_t size, void * data, piocallback done);

#endif